package com.newhero.security;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class MacAddressUtil {
    /**
     *  获取当前操作系统名称.
     *  return 操作系统名称 例如:windows,Linux,Unix等.
     */
    public static String getOSName()
    {
        return System.getProperty("os.name").toLowerCase();
    }
             
    /**
     * 获取Unix网卡的mac地址.
     * @return mac地址
     */
    public static String getUnixMACAddress()
    {
        String mac = null;
        BufferedReader bufferedReader = null;
        Process process = null;
        try
        {
            /**
             *  Unix下的命令，一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
             */
            process = Runtime.getRuntime().exec("ifconfig eth0");
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            int index = -1;
            while ((line = bufferedReader.readLine()) != null)
            {
                /**
                 *  寻找标示字符串[hwaddr]
                 */
                index = line.toLowerCase().indexOf("hwaddr");
                /**
                 * 找到了
                 */
                if (index != -1)
                {
                    /**
                     *   取出mac地址并去除2边空格
                     */
                    mac = line.substring(index +"hwaddr".length()+ 1).trim();
                    break;
                }
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (bufferedReader != null)
                {
                    bufferedReader.close();
                }
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }
            bufferedReader = null;
            process = null;
        }
        return mac;
    }      

    /**    
     * 获取Linux网卡的mac地址.    
     * @return mac地址    
     */      
    public static String getLinuxMACAddress() 
    {
        String mac = null;
        BufferedReader bufferedReader = null;
        Process process = null;
        try
        {
            /**
             *  linux下的命令，一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
             */
            process = Runtime.getRuntime().exec("ifconfig eth0");
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            int index = -1;
            while ((line = bufferedReader.readLine()) != null) 
            {
                index = line.toLowerCase().indexOf("硬件地址");
                /**
                 * 找到了
                 */
                if (index != -1)
                {
                    /**
                     * 取出mac地址并去除2边空格
                     */
                    mac = line.substring(index+4).trim();
                    break;      
                }
            }      
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (bufferedReader != null)
                {
                    bufferedReader.close();
                }
            }
            catch (IOException e1) 
            {
                e1.printStackTrace();
            }
            bufferedReader = null;
            process = null;
        }    
        return mac;
    }
           
    /**    
     * 获取widnows网卡的mac地址.    
     * @return mac地址    
     */      
    public static String getWindowsMACAddress()
    {
        String mac = null;
        BufferedReader bufferedReader = null;
        Process process = null;
        try
        {
            /**
             * windows下的命令，显示信息中包含有mac地址信息     
             */
            process = Runtime.getRuntime().exec("ipconfig /all");
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));      
            String line = null;
            int index = -1;
            while ((line = bufferedReader.readLine()) != null)
            {
                /**
                 *  寻找标示字符串[physical address]
                 */
                index = line.toLowerCase().indexOf("physical address");
                if(index == -1)
                {
                    index = line.toLowerCase().indexOf("物理地址");
                }
                if (index != -1)
                {
                    index = line.indexOf(":");    
                    if (index != -1)
                    {
                        /**   
                         *   取出mac地址并去除2边空格   
                         */   
                        mac = line.substring(index + 1).trim();
                        if(mac == null || "".equals(mac))
                        {
                            continue;
                        }
                    }    
                    break;      
                }    
            }    
        } 
        catch (IOException e) 
        {     
            e.printStackTrace();
        }
        finally 
        {
            try
            {      
                if (bufferedReader != null) 
                {
                    bufferedReader.close();
                }
            }
            catch (IOException e1)
            {
                e1.printStackTrace();
            }
            bufferedReader = null;
            process = null;
        }      
        return mac;   
    }
    
    public static String getAixMACAddress() 
    {
        String mac = "";
        try 
        {
            Process process = Runtime.getRuntime().exec("netstat -i");
            BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = bufferedreader.readLine();
            if (line != null) 
            {
                String nextLine = bufferedreader.readLine();
                String datas[] = nextLine.split(" ");
                mac = datas[3];
            }
            bufferedreader.close();
            process.waitFor();
        } 
        catch (Exception exception) 
        {
            System.out.println(exception);
            mac = "";
        }
        return mac.trim().replace('.', '-');
    }

    public static String getHostname() 
    {
        String hostname = "";
        try 
        {
            InetAddress addr = InetAddress.getLocalHost();
            hostname = addr.getHostName();
        } 
        catch (UnknownHostException e) 
        {
            e.printStackTrace();
        }
        return hostname;
    }

    /**
     * 
     * @return
     */
    public static String getMacAddress() 
    {      
        String os = getOSName();
        String mac = "";
        if(os.startsWith("windows"))
        {
            mac = getWindowsMACAddress();
        }
        else if(os.startsWith("linux"))
        {
            mac = getLinuxMACAddress();
        }
        else if(os.startsWith("aix"))
        {
            mac = getAixMACAddress();
        }
        else
        {
            mac = getUnixMACAddress();
        }
        return mac;
    }  
}
